package com.snapan.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

public class FileContentExtractor {
    private static final Tika tika = new Tika();

    // 仅需提取内容的文档类后缀（直接通过后缀判断，不依赖外部类型字段）
    private static final Set<String> NEED_EXTRACT_SUFFIXES = new HashSet<>(Arrays.asList(
            "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "md", "rtf"
    ));

    // OSS配置（静态变量，通过静态代码块初始化）
    private static String OSS_ACCESS_KEY_ID;
    private static String OSS_ACCESS_KEY_SECRET;
    private static String OSS_ENDPOINT;
    private static OSS ossClient; // 延迟初始化，避免空指针

    // 静态代码块：手动加载配置文件并初始化OSS客户端
    static {
        try {
            // 读取配置文件（假设配置在 src/main/resources/oss.properties）
            Resource resource = new ClassPathResource("application.properties"); // 路径根据实际调整
            Properties props = PropertiesLoaderUtils.loadProperties(resource);

            // 赋值配置
            OSS_ACCESS_KEY_ID = props.getProperty("oss.access-key-id");
            OSS_ACCESS_KEY_SECRET = props.getProperty("oss.access-key-secret");
            OSS_ENDPOINT = props.getProperty("oss.endpoint");

            // 初始化OSS客户端
            ossClient = new OSSClientBuilder().build(OSS_ENDPOINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("OSS配置加载失败，请检查oss.properties文件");
        }
    }

    /**
     * 提取文件内容（仅对文档类后缀有效）
     * @param filePath OSS文件路径（如"https://bucket.oss-cn-beijing.aliyuncs.com/test.pdf"）
     * @param isDirectory 是否为文件夹（1=是，0=否）
     * @return 提取的内容（非文档类后缀返回说明）
     */
    public static String extractContent(String filePath, Integer isDirectory) {
        // 文件夹直接返回空
        if (isDirectory == 1) {
            return "";
        }

        // 获取文件后缀（如"pdf"、"mp3"，不含"."）
        String fileSuffix = getFileSuffix(filePath).toLowerCase();

        // 仅对文档类后缀提取内容，其他后缀直接返回说明
        if (NEED_EXTRACT_SUFFIXES.contains(fileSuffix)) {
            return extractDocumentContent(filePath);
        } else {
            // 非文档类后缀（如mp3、jpg等）返回说明，避免解析异常
            return "";
        }
    }

    /**
     * 提取文档类文件的内容（仅被NEED_EXTRACT_SUFFIXES包含的后缀调用）
     */
    private static String extractDocumentContent(String filePath) {
        // 使用try-with-resources自动关闭流，避免资源泄漏
        try (InputStream inputStream = getOssInputStream(filePath)) {
            if (inputStream == null) {
                return "";
            }
            // 缓冲流提升效率，限制解析长度（100KB）避免大文件超时
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            return tika.parseToString(bufferedInputStream);
        } catch (MalformedURLException e) {
            return "";
        } catch (IOException | TikaException e) {
            return "";
        }
    }

    /**
     * 从文件路径中提取后缀（不含"."，如"mp3"、"txt"）
     */
    private static String getFileSuffix(String filePath) {
        if (filePath == null || filePath.isEmpty()) {
            return "";
        }
        // 找到最后一个"."的位置（处理URL中可能的参数，如"?x-oss-process=..."）
        int lastDotIndex = filePath.lastIndexOf(".");
        int lastQuestionIndex = filePath.lastIndexOf("?"); // 排除URL参数干扰
        // 如果存在参数，后缀截止到"?"之前
        if (lastQuestionIndex != -1 && lastQuestionIndex > lastDotIndex) {
            return "";
        }
        // 提取后缀（如"test.mp3" -> "mp3"）
        if (lastDotIndex != -1 && lastDotIndex < filePath.length() - 1) {
            return filePath.substring(lastDotIndex + 1);
        }
        return ""; // 无后缀
    }

    /**
     * 获取OSS文件输入流
     */
    private static InputStream getOssInputStream(String filePath) {
        try {
            URL ossUrl = new URL(filePath);
            String host = ossUrl.getHost();
            String bucketName = host.split("\\.")[0]; // 从域名提取bucket名
            String objectKey = ossUrl.getPath().substring(1); // 去掉路径中的第一个"/"
            OSSObject ossObject = ossClient.getObject(bucketName, objectKey);
            return ossObject.getObjectContent();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}